iT邦幫忙

2023 iThome 鐵人賽

DAY 19
1
Software Development

Spring Boot 零基礎入門系列 第 19

Spring Boot 零基礎入門 (19) - 取得請求參數 (上) - @RequestParam、@RequestBody

  • 分享至 

  • xImage
  •  

賀!此系列文榮獲 2023 iThome 鐵人賽《優選》獎項,正在規劃出書中,感謝大家的支持🙏,同名課程「Java 工程師必備!Spring Boot 零基礎入門」也已在 Hahow 平台上架

哈囉大家好,我是古古

上一篇文章有介紹 Http method 中,GET 和 POST 是怎麼用不同的方式傳遞參數給後端的,讓大家先對參數的傳遞有一個認識

那麼接著這篇文章,就會回到 Spring Boot 上,介紹要如何在 Spring Boot 中,去接住前端所傳過來的這些參數的值,也因為這邊有比較多種方式可以接住前端的值,因此會分成上、下兩篇來介紹,那所以我們就開始吧!

回顧:GET 和 POST 傳遞參數的方式


GET 請求

在上一篇文章中有介紹到,GET 是明信片的概念,所以 「前端只能夠將參數放在 url 的最後面,透過這個格式將參數傳遞給後端」,而這些放在 url 最後面的參數,我們會稱為是 query parameter

也因為 GET 是將參數 (query parameter) 放在 url 的最後面,又因為 url 是公開可見的,所以「當你使用 GET 方法時,你所傳遞的參數就會被別人所看見」,因此才說 GET 是明信片的概念(也就是內容都會被別人看光光)

https://ithelp.ithome.com.tw/upload/images/20231004/20151036VXZspxZ3uC.png

POST 請求

而不同於 GET 請求,POST 則是信封的概念,因此 「前端則會將參數放在 request body 中做傳遞」,並且通常是使用 Json 格式來傳遞

也因為 request body 中的值會被封裝起來,因此參數不會洩漏,因此才說 POST 是信封的概念(也就是內容不會被其他人看到

https://ithelp.ithome.com.tw/upload/images/20231004/20151036um9qaEcHKF.png

而了解了 GET 和 POST 傳遞參數的不同方式之後,我們就可以實際的到 Spring Boot 中,來看一下要如何在 Spring Boot 中,去接住這些前端傳過來的參數

在 Spring Boot 中接住參數的四個註解


在 Spring Boot 中,有四個註解可以去接住前端的參數,分別是:

  1. @RequestParam
  2. @RequestBody
  3. @RequestHeader
  4. @PathVariable

這四個註解雖然長得滿像的(都是以 @Request 開頭),但是他們功能是完全不同的,所以接下來就會分成兩篇文章,分別來介紹這四個註解要如何使用

1. @RequestParam:接住放在 Url 後面的參數


首先先介紹第一個 @ReqeustParam,他的用途,就是去 「接住那些放在 url 後面的參數」

像是上面的 GET 方法在傳遞參數時,就是把參數放在 url 的最後面來傳遞,因此當前端使用 GET 方法來發起一個 Http request 時,Spring Boot 這邊就是會使用 @RequestParam,來將前端所傳遞過來的參數給接住

如何運用 @RequestParam?

舉例來說,假設我們今天使用了 GET 請求,並且在 url 的最後面,加上一個 id=123 的參數的話,那麼實際的 url 就會長得像是這個樣子

http://localhost:8080/test1?id=123

那麼當前端透過這個格式,傳遞 id=123 的參數的值來的話,在 Spring Boot 這邊,就只需要在 test1() 方法中,去新增一個 Integer 類型的參數 id,並且在這個參數的前面,去加上一個 @RequestParam

這樣到時候,id 的值就會是 123,因此我們就成功的取得到前端傳遞過來的參數的值了!

https://ithelp.ithome.com.tw/upload/images/20231004/20151036yuShO1DF0C.png

使用 @RequestParam 的注意事項之一:參數名字須一致

在使用 @RequestParam 去接住 url 後面的參數時,首先有一個重點需要注意,就是在 Spring Boot 中的變數的「名字」,必須要和 url 中的參數的「名字」一樣才可以

換句話說,假設 url 中添加的是 id=123,那麼在 Spring Boot 中的參數的名字,也必須是 id,但如果 url 中添加的是 name=Judy,那麼在 Spring Boot 中的參數的名字,就必須是 name

假設參數名字不一致的話,@RequestParam 是沒有辦法成功取得到 url 中的參數的,因此這部分需要特別注意!

補充:其實 @RequestParam 也是有支援一些設定,讓「url 中的參數名字」和「Spring Boot 中的參數名字」可以不同的,但如果沒有特別設定的話,Spring Boot 是會找不到的該參數的值的

因此大家在一開始學習時,就建議盡量讓參數名字一致,比較不會出現問題!

使用 @RequestParam 的注意事項之二:參數類型需一致

使用 @RequestParam 去接住 url 參數的第二個重點,就是「參數的類型需要一致」

譬如說在 url 中所添加的是 id=123,那就是在暗示這個 id 參數的值是一個整數,因此在 Spring Boot 中就需要將該參數宣告為 Integer id 或是 int id

但如果 url 中所添加的是 name=Judy,那就是在暗示這個 name 參數的值是一個字串,因此在 Spring Boot 中需要將該參數宣告為 String name

只有當類型一致時,Spring Boot 才有辦法順利將該參數的值給轉換過來,否則的話 Spring Boot 是會報錯的!

小結

所以只要好好運用 @RequestParam 這個註解,我們就可以去取得前端放在 url 後面的那些參數了!

2. @RequestBody:接住放在 request body 中的參數


了解如何取得 url 後面的參數之後,接著我們可以來看一下,要怎麼透過 @RequestBody,來取得前端放在 request body 中的參數

@RequestBody 的用途,就是去 「接住放在 request body 中的參數」,像是上面的 POST 方法在傳遞參數時,就是把參數放在 request body 中來傳遞

因此如果我們想要去接住這些放在 request body 中的參數的話,那麼就是要使用 @RequestBody 才能接住!

如何運用 @RequestBody?

舉例來說,假設前端在 request body 中,傳遞了下圖中 Json 格式的參數過來的話

https://ithelp.ithome.com.tw/upload/images/20231004/20151036NBiChY2HdW.png

那麼我們首先要做的,就是去創建一個和這個 Json 格式「一一對應」的 Java class 出來

譬如說我們可以先去 new 一個新的 Student class 出來,並且在該 Student class 中添加下列的程式

public class Student {
    
    private Integer id;
    private String name;

    // getter 和 setter
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

當我們這樣寫之後,就等於是創建了一個「和 Json 格式一一對應的 Java class」出來了!

大家觀察一下可以發現,在 Json 格式中有兩個 key,分別是 id 和 name,其中 id 的值是「整數」的 123,而 name 的值是「字串」的 Judy

而在 Student class 裡面,也有兩個變數,分別是 id 和 name,並且 id 的類型「也是整數」,而 name 的類型「也是 String」

因此只要我們去創建了一個和 Json 格式一一對應的 Java class 出來,那麼 Spring Boot 到時候,就可以去將 request body 中的 Json 格式,給轉回來成這個 Student class,並且將 id 和 name 的 value 的值,存放在 Student 中的 id 和 name 的變數裡了!

https://ithelp.ithome.com.tw/upload/images/20231004/20151036FR6HaBskcK.png

而了解這個「Json 格式和 Java class 的轉換邏輯」之後,最後就只要像 @RequestParam 的用法一樣,在 test2() 方法中,去新增一個 Student 類型的參數 student,並且在這個參數的前面,去加上一個 @RequestBody

這樣到時候,Spring Boot 就會將 request body 中的 Json 格式,給轉換成是我們自定義的 Student class,因此我們就也能成功的取得到前端傳遞過來的參數的值了!

https://ithelp.ithome.com.tw/upload/images/20231004/20151036SjPtbtg3R8.png

使用 @RequestBody 的注意事項之一:Json 格式轉換要小心

在使用 @RequestBody 去接住前端放在 request body 中的參數時,最需要特別注意的就是「和 Json 格式一一對應的 Java class」要小心不要寫錯,只要注意好這一點,基本上就沒有特別需要小心的部分了~

總結


這篇文章先簡單列出了 Spring Boot 中提供的四種取得前端參數的註解,並且接著詳細介紹了其中的兩個註解:@ReqestParam@RequestBody,介紹要如何透過這兩個註解,分別去取得前端放在 url 最後面的參數、以及取得前端放在 request body 中的參數

那麼下一篇文章,我們就會來介紹另外兩個取得前端參數的註解:@RequestHeader 以及 @PathVariable,那我們就下一篇文章見啦!

相關連結



上一篇
Spring Boot 零基礎入門 (18) - 常見的 Http method - GET 和 POST
下一篇
Spring Boot 零基礎入門 (20) - 取得請求參數 (下) - @RequestHeader、@PathVariable
系列文
Spring Boot 零基礎入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言